閉包是功能獨立的區塊,可以在程式之間被傳遞及使用。像是之前提到的巢狀函式 ( Nested Function ),就是一種閉包。
閉包有三種表示方式:
・函式就是一種有名字的閉包
・巢狀函式是一種有名字且被包在其他函式中的閉包
・閉包表達式是使用簡潔的語法來描述一種沒有名字的閉包,可以在程式之間傳遞及使用。
Swift 提供了一種叫做 sorted的方法,根據我們提供的排序閉包,將已知類型數組的值進行排序,一旦排序完成,sorted 會回傳與原數組類型大小完全相同的數組,這個新數組是已經排序好的。我們可以用 sorted() 去使用 sorted 的功能,再沒有特別設定之下,sorted的功能就是將 Array 中的數值從小到大排列,字串則是照字母順序:
如果我們想要讓 Array 由大到小排序 ( 字串則反之 ),可以透過定義 function,並使用 sorted(by: ):
閉包表達式:
閉包表達式 ( Closure Expression ) 是一種用簡潔語法建立匿名函式的方式。同時提共了優化語法,可以使程式碼變得更好讀。
{(參數)-> 返回值型別 in 內部程式 }
從上面的程式看到,與一般函式相同的是閉包同樣有一個大括號將程式包起來,不過省略了名稱,包著參數的小括號放到大括號裡面,接著返回型別,再接一個 in 執行內部程式
在這邊我們不是建立一個 function,而是將這些參數及回傳值等等包在一個大括號中,最後再用 in 導入內部程式
因為排序閉包是實際參數傳遞給函數,所以 Swift 可以判斷他的形式參數類型及回傳型別
單行表達式閉包可以透過隱藏 return 來隱式回傳單行表達式的結果
Swift 為閉包提供參數名稱縮寫功能,能直接以 $0, $1, $2 這種方式來依序呼叫閉包的參數。如果使用了參數名稱縮寫,就可以省略閉包參數列表中對其定義,而且對應參數名稱縮寫的型別會透過函式型別自動推斷,所以 in 也會同被省略
Swift 的 String 定義了關於大於符號等特定符號的實現,與 sorted 所需要的相符合
今天的 Closure 就到這裡囉!如果有其他的問題歡迎留言或是寄信給我!(*´∀`)